package com.vt.vthacks; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicSessionCredentials; import com.amazonaws.services.sns.AmazonSNSClient; import com.amazonaws.services.sns.model.CreatePlatformEndpointRequest; import com.amazonaws.services.sns.model.CreatePlatformEndpointResult; import com.amazonaws.services.sns.model.SubscribeRequest; import com.amazonaws.services.sns.model.SubscribeResult; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.util.Log; public class RegisterWithSNSRunnable implements Runnable { private static final String TAG = "RegisterWithSNSRunnable"; private static final long MAX_RETRY_TIME = 1024000; private Context context; private long retryTime; public RegisterWithSNSRunnable(Context context, long retryTime) { this.context = context; this.retryTime = retryTime; } /** * Registers this device with SNS. * * Precondition: GCM ID and AWS credentials for this device are stored in shared prefs. * Success: Device is registered for push notifications and this is stored in shared prefs. */ @Override public void run() { SharedPreferences sharedPreferences = context.getSharedPreferences(Constants.PREFS, Context.MODE_PRIVATE); if (!sharedPreferences.getBoolean(Constants.PREFS_AWS_REGISTERED, false)) { String gcmId = sharedPreferences.getString(Constants.PREFS_GCM_ID, null); String secretAccessKey = sharedPreferences.getString(Constants.PREFS_AWS_SECRET_ACCESS_KEY, null); String securityToken = sharedPreferences.getString(Constants.PREFS_AWS_SECURITY_TOKEN, null); String expiration = sharedPreferences.getString(Constants.PREFS_AWS_EXPIRATION, null); String accessKeyID = sharedPreferences.getString(Constants.PREFS_AWS_ACCESS_KEY_ID, null); if (gcmId == null || secretAccessKey == null || securityToken == null || expiration == null || accessKeyID == null) { Log.d(TAG, "Not all credentials are available."); return; } if (GetAWSCredentialsRunnable.areCredentialsExpired(expiration)) { new GetAWSCredentialsRunnable(context, 1024).run(); retrySNS(); return; } AWSCredentials credentials = new BasicSessionCredentials(accessKeyID, secretAccessKey, securityToken); AmazonSNSClient client = new AmazonSNSClient(credentials); CreatePlatformEndpointRequest createEndpointRequest = new CreatePlatformEndpointRequest(); createEndpointRequest.setPlatformApplicationArn(Constants.AWS_PLATFORM_APPLICATION_ARN); createEndpointRequest.setToken(gcmId); CreatePlatformEndpointResult endpointResult = client.createPlatformEndpoint(createEndpointRequest); if (endpointResult == null) { Log.d(TAG, "Failed to create platform endpoint."); retrySNS(); return; } String snsArn = endpointResult.getEndpointArn(); SubscribeRequest subscribeRequest = new SubscribeRequest(Constants.AWS_TOPIC_ARN, Constants.AWS_PROTOCOL, snsArn); SubscribeResult subscribeResult = client.subscribe(subscribeRequest); if (subscribeResult == null) { Log.d(TAG, "Failed to subscribe to topic."); retrySNS(); return; } Editor editor = sharedPreferences.edit(); editor.putBoolean(Constants.PREFS_AWS_REGISTERED, true); editor.commit(); } } private void retrySNS() { if (retryTime > MAX_RETRY_TIME) { return; } try { Thread.sleep(retryTime); } catch (InterruptedException e) { // You win some, you lose some. } retryTime *= 2; run(); } }